home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / csrc720j.lzh / prtlog.c < prev    next >
C/C++ Source or Header  |  1993-01-10  |  15KB  |  640 lines

  1.  
  2. /*
  3.  * PRTLOG.C - 10/11/87 - Print a log file. For C BBS V3.5
  4.  */
  5.  
  6. #include <stdio.h>
  7. #ifdef MCH_AMIGA
  8. /* Modifications for the AMIGA version V6.71b
  9.    The program has a correction to make the system uptime more realistic.
  10.    I have also added code to do a little bit more 'accounting' of each
  11.    user. A third output page has been added which, for each user who logs
  12.    in and for each bbs that does a reverse forward, contains the total
  13.    connect time and number of connects, Total number of read and send
  14.    commands and the total number of forwards (which is also reported on
  15.    the previous page.
  16.    This program still does not do accounting for multi-port systems
  17.    because although it reports which port a user is on when they log in,
  18.    the disconnect command does not report which port is logging out. This
  19.    makes it difficult to be sure who is actually logged out.
  20. */
  21. #include <string.h>
  22. #include <stdlib.h>
  23. long tdiff();
  24. #endif
  25.  
  26. /* Cosmetic C definitions */
  27.  
  28. #define  is   ==
  29. #define  isnt   !=
  30. #define  and   &&
  31. #define  or   ||
  32. #define  not   !
  33. #define  true   1
  34. #define  false   0
  35. #define  match   !strcmp
  36.  
  37. #define  linelen 256
  38.  
  39. FILE   *lfl;
  40. int   lall, isuser;
  41.  
  42. short first   = false;
  43. short wasq   = true;
  44. short aconnect   = false;
  45. long  gate   = 0;
  46. long  logd   = 0;
  47. long  down   = 0;
  48. long  avail   = 0;
  49. long  online   = 0;
  50. long  offline   = 0;
  51. long  idle   = 0;
  52. long  connected = 0;
  53. long  sysop   = 0;
  54. long  fwdcon   = 0;
  55. long  fwddis   = 0;
  56.  
  57. int   ngate   = 0;
  58. int   nup   = 0;
  59. int   ndown   = 0;
  60. int   crash   = 0;
  61. int   links   = 0;
  62. int   nts   = 0;
  63. int   scon   = 0;
  64. int   ucon   = 0;
  65. int   lines   = 0;
  66.  
  67. static char  line[linelen];
  68. #ifdef MCH_AMIGA
  69. static char  sysop_call[6];
  70. static char  conx_call[9];
  71. short sysop_log = 0;
  72. #endif
  73. char  *fst, *lp, typ, fn, sfn;
  74.  
  75. struct t
  76. {
  77.   char year[2];
  78.   char month[2];
  79.   char day[2];
  80.   char time[4];
  81. } con, dis, cur, fir, gat, las, sfwd;
  82.  
  83. int nmsg;
  84. int cbin[31][24];
  85. int fbin[31][24];
  86.  
  87. typedef struct FWD_S
  88. {
  89.   char call[9];
  90.   int  count;
  91. #ifdef MCH_AMIGA
  92.    long connect;
  93.    short conx_count;
  94.    short reads;
  95.    short sends;
  96. #endif
  97.   struct FWD_S *next;
  98. } FWD;
  99.  
  100.  
  101. FWD *fwdhd = NULL;
  102. FWD *fp;
  103. #ifdef MCH_AMIGA
  104. FWD *fp_file;
  105. FWD *fp_conx;
  106. #endif
  107.  
  108. #define softeof '\032'
  109.  
  110. main(argc, argv)
  111. int argc;
  112. char *argv[];
  113. {
  114.   register char ch, *cp;
  115.   int i, j, t, done, infile, nfwd;
  116.   int firstent = true;
  117.  
  118.   if (*argv[1] is '-')
  119.   {
  120.     infile = 2; lall = true;
  121.   }
  122.   else
  123.   {
  124.     infile = 1; lall = false;
  125.   }
  126.  
  127.   if ((lfl = fopen(argv[infile], "r")) is NULL)
  128.   { printf("File not found.\n"); exit(0); }
  129.  
  130.   for (i = 0; i < 31; i++) for (j = 0; j < 24; j++)
  131.     { cbin[i][j] = 0; fbin[i][j] = 0; }
  132.  
  133.   while (fgets(line, linelen, lfl) isnt NULL)
  134.   {
  135.     lp = line;
  136.     typ = *lp++;
  137.     cur.year[0]  = *lp++; cur.year[1]  = *lp++;
  138.     cur.month[0] = *lp++; cur.month[1] = *lp++;
  139.     cur.day[0]    = *lp++; cur.day[1]   = *lp++;
  140.     for (cp = cur.time;  cp < cur.time + 4;)  *cp++ = *lp++;
  141.  
  142.     fn = *lp++;
  143.     sfn = *lp++;
  144.     lp++;
  145.     for (cp = lp; *cp; cp++) if ((*cp is '\r') or (*cp is '\n')) *cp = '\0';
  146.  
  147.     if (firstent)
  148.     {
  149.       con = cur; dis = cur; fir = cur; gat = cur; las = cur; sfwd = cur;
  150.       firstent = false;
  151.     }
  152.  
  153.     if (lall)
  154.     {
  155.       if ((typ is 'C') and (fn isnt 'L')) printf("\n");
  156.       if (first and (typ is 'M') and (fn is 'F'))
  157.    { first=false; printf("\n"); }
  158.       printf("     %2.2s/%2.2s/%2.2s %4.4s ",
  159.       cur.month,cur.day,cur.year,cur.time);
  160.     }
  161.  
  162.     lines++;
  163.     switch(typ)
  164.     {
  165.       case 'C': doconn(); break;
  166.       case 'F': dofile(); break;
  167.       case 'G': dogate(); break;
  168.       case 'M': domsg();  break;
  169.       case 'X': doexit(); break;
  170.       default:
  171. /*     printf("Unknown log item type %c\n", typ); */
  172.     ;
  173.     }
  174.  
  175.     las = cur;
  176.   }
  177.  
  178.   fclose(lfl);
  179.  
  180.   if (lall) printf("\f");
  181. #ifndef MCH_AMIGA
  182.   printf("\n     Log for %6.6s      ",call);
  183. #else
  184.   printf("\n     Log for %6.6s      ",sysop_call);
  185. #endif
  186.   printf("From %2.2s/%2.2s/%2.2s %4.4s ",
  187.     fir.month, fir.day, fir.year, fir.time);
  188.   printf(" To %2.2s/%2.2s/%2.2s %4.4s\n",
  189.     cur.month, cur.day, cur.year, cur.time);
  190.  
  191.   printf("     Data from file %s\n",argv[infile]);
  192.   printf("\n                   Connects vs. Hour vs. Date\n\nDa");
  193.  
  194.   ucon    = prtbin(cbin);
  195.  
  196.   avail  = idle + connected;
  197.   online = avail + sysop;
  198.   logd    = online + down + offline;
  199.   idle   -= fwddis;
  200.  
  201.   printf("\n%8d log items.\n", lines);
  202.   printf("%8ld minutes in log.\n", logd);
  203.   printf("%8ld minutes system down.\n", down);
  204.   printf("%8ld minutes system offline.\n", offline);
  205.  
  206.   cp="minutes system online.";
  207.   printf("%8ld %-30s", online, cp);
  208.   printf(" (%5.1f%% of log time.)\n",100.*((float)online/(float)logd));
  209.  
  210.   cp="minutes by sysop.";
  211.   printf("%8ld %-30s", sysop, cp);
  212.   printf(" (%5.1f%% of online time.)\n",100.*((float)sysop/(float)online));
  213.  
  214.   cp="minutes forwarding.";
  215.   printf("%8ld %-30s", fwdcon + fwddis, cp);
  216.   printf(" (%5.1f%% of online time.)\n",100.*((float)(fwdcon + fwddis)/(float)online));
  217.  
  218.   cp="minutes system available.";
  219.   printf("%8ld %-30s", avail, cp);
  220.   printf(" (%5.1f%% of online time.)\n",100.*((float)avail/(float)online));
  221.  
  222.   cp="minutes by users.";
  223.   printf("%8ld %-30s", connected, cp);
  224.   printf(" (%5.1f%% of available time.)\n",100.*((float)connected/(float)avail));
  225.  
  226.   cp="minutes system idle.";
  227.   printf("%8ld %-30s", idle, cp);
  228.   printf(" (%5.1f%% of available time.)\n",100.*((float)idle/(float)avail));
  229.  
  230.   cp="minutes GateWay in use.";
  231.   printf("%8ld %-30s",gate,cp);
  232.   printf(" (%5.1f%% of available time.)\n",100.*((float)gate/(float)avail));
  233.  
  234.   printf("\n%8d connects, %d were links.\n",ucon,links);
  235.   printf("%8d times used by sysop. GateWay used %d times.\n",
  236.   scon,ngate);
  237.   printf("\n%8d File uploads, %d File downloads.\n", nup, ndown);
  238.  
  239.   printf("%8d probable system crashes.\n",crash);
  240.  
  241.   printf("\f\n                   Forwards vs. Hour vs. Date\n\nDa");
  242.  
  243.   nfwd=prtbin(fbin);
  244.  
  245.   printf("\n%8d Messages entered.\n\n", nmsg);
  246.   printf("%8d NTS Messages       (%5.1f%% of messages entered)\n\n",
  247.     nts, 100.*((float)nts/(float)nmsg));
  248.   printf("%8d Messages forwarded (%5.1f%% of messages entered)\n\n",
  249.     nfwd,100.*((float)nfwd/(float)nmsg));
  250.  
  251.   for (fp = fwdhd; fp isnt NULL; fp = fp->next)
  252.   {
  253. #ifdef MCH_AMIGA
  254.   if(fp->count) {
  255. #endif
  256.     printf("%8d To %9.9s",fp->count,fp->call);
  257.     printf(" (%5.1f%% of messages forwarded.)\n",
  258.       100.*((float)fp->count/(float)nfwd));
  259. #ifdef MCH_AMIGA
  260.   }
  261. #endif
  262.   }
  263. #ifdef MCH_AMIGA
  264.    printf("\f\n\n User Login Information \n\n");
  265.    printf("    Call   <- Connected ->  Reads Sends   Fwds\n");
  266.    printf("            HHH:MM  ####     ####  ####   ####\n");
  267.    for(fp = fwdhd; fp isnt NULL; fp = fp->next) {
  268.       printf(" %9.9s ",fp->call);
  269.       printf(" %3d:%02d ",(short)(fp->connect/60),(short)(fp->connect%60));
  270.       printf(" %4d  ",fp->conx_count);
  271.       printf("   %4d ",fp->reads);
  272.       printf(" %4d ",fp->sends);
  273.       printf("  %4d\n",fp->count);
  274.    }
  275.    printf("\n\n\n");
  276. #endif
  277.  
  278. }
  279.  
  280. #ifdef MCH_AMIGA
  281. FWD *getuser(call)
  282. char *call;
  283. {
  284.    register FWD *fp;
  285.    for(fp = fwdhd; fp isnt NULL; fp=fp->next) {
  286.       /* If this is the call then return. fp will be pointing to the
  287.          item
  288.       */
  289.       if(!strncmp(fp->call, call, 9))return(fp);
  290.    }
  291.  
  292.    fp = (FWD *)malloc(sizeof(FWD));
  293.    fp->next = fwdhd;
  294.    fwdhd = fp;
  295.    fp->count = 0;
  296.    fp->conx_count = 0;
  297.    fp->reads = 0;
  298.    fp->sends = 0;
  299.    fp->connect = 0L;
  300.  
  301.    strncpy(fp->call, call, 9);
  302.    return(fp);
  303. }
  304. #endif
  305. prtbin(b)
  306. int   b[31][24];
  307. {
  308.   register int i, j, t, gt;
  309.  
  310.   for (j = 0; j < 24; j++) printf("%3d",j); printf(" Totl\n");
  311.   for (i = 0; i < 31; i++)
  312.   {
  313.     t = 0;
  314.     printf("%2d",i+1);
  315.     for (j = 0; j < 24; j++)
  316.     {
  317.       if (b[i][j]) printf("%3d",b[i][j]); else printf("  .");
  318.       t += b[i][j];
  319.     }
  320.     printf("%5d\n",t);
  321.   }
  322.  
  323.   gt = 0; printf("  ");
  324.   for (j = 0; j < 24; j++)
  325.  
  326.   {
  327.     t = 0; for (i = 0; i < 31; i++) t += b[i][j];
  328.     gt += t; printf("%3d",t);
  329.   }
  330.   printf("%5d\n",gt);
  331.   return gt;
  332. }
  333.  
  334. dogate()
  335. {
  336.   switch(fn)
  337.   {
  338.     case 'E': gate += (long)tdiff(&gat,&cur); break;
  339.     case 'S': ngate++; break;
  340.     default:  ;
  341.   }
  342.   gat = cur;
  343.  
  344.   if (lall) switch(fn)
  345.   {
  346.     case 'A': printf("Attempted connect to %s\n", lp); break;
  347.     case 'C': printf("Connect to %s\n", lp); break;
  348.     case 'E': printf("GateWay End\n"); break;
  349.     case 'M': printf("Monitor Start\n"); break;
  350.     case 'S': printf("GateWay Start\n"); break;
  351.     case 'U': printf("Unproto Start\n"); break;
  352.   }
  353. }
  354.  
  355. dofile()
  356. {
  357.   if (lall) switch(fn)
  358.   {
  359.     case 'D': printf("Download %s\n", lp); break;
  360.     case 'U': printf("Upload %s\n", lp); break;
  361.     case 'W': printf("Directory %s\n", lp); break;
  362.   }
  363.  
  364.   switch(fn)
  365.   {
  366.     case 'D': ndown++; break;
  367.     case 'U': nup++;   break;
  368.   }
  369. }
  370.  
  371. dofwd()
  372. {
  373.   register int i, find;
  374.   register char *cp, *llp;
  375.   char call[9];
  376.  
  377.   ++fbin[i2(cur.day) - 1][i2(cur.time)];
  378.  
  379.   for (llp = lp; *llp isnt ' '; llp++); llp++;
  380.   llp += 2;
  381.   for (cp = call; ((cp < call + 9) and (*llp isnt ' ') and (*llp isnt '\0'));)
  382.     *(cp++) = *(llp++);
  383.   for (;cp < call + 9;) *(cp++)=' ';
  384. #ifndef MCH_AMIGA
  385.   find = false;
  386.   for (fp = fwdhd; ((fp isnt NULL) and !find); fp=fp->next)
  387.   {
  388.     find = !strncmp(fp->call, call, 9);
  389.     if (find) ++(fp->count);
  390.   }
  391.  
  392.   if (!find)
  393.   {
  394.     fp = (FWD *)malloc(sizeof(FWD));
  395.     fp->next = fwdhd; fwdhd = fp;
  396.     fp->count = 1; strncpy(fp->call, call, 9);
  397.   }
  398. #else
  399. /* getuser finds call if it exists already and creates a new record if
  400.    it doesn't. Either way, it returns a pointer to the item.
  401. */
  402.    fp_file = getuser(&call[0]);
  403.    fp_file->count++;
  404. #endif
  405. }
  406. /*
  407.  */
  408.  
  409. domsg()
  410. {
  411. #ifndef MCH_AMIGA
  412.   register int etime;
  413. #else
  414.    register long etime;
  415. #endif
  416.  
  417.   switch(fn)
  418.   {
  419.     case 'F':
  420.       if (sfn is 'S') sfwd = cur;
  421.       else if (sfn is 'E')
  422.       {
  423.    etime = tdiff(&sfwd, &cur);
  424.    if (aconnect) fwdcon += (long)etime; else fwddis += (long)etime;
  425.       }
  426.       else if (sfn isnt 'R') dofwd();
  427.       break;
  428.  
  429. #ifdef MCH_AMIGA
  430.     case 'R':
  431.       fp_conx->reads++;
  432.       break;
  433.     case 'S':
  434.       fp_conx->sends++;
  435. #endif
  436.     case 'C':
  437.     case 'M':
  438. #ifndef MCH_AMIGA
  439.     case 'S':
  440. #endif
  441.       nmsg++;
  442.       if (sfn is 'T') nts++;
  443.       break;
  444.   }
  445.  
  446.   if (lall) switch(fn)
  447.   {
  448.     case 'C': printf("Copy %s\n", lp); break;
  449.     case 'E': printf("Edit %s\n", lp); break;
  450.     case 'F':
  451.       if (sfn is 'S')
  452.    printf("Begin forwarding\n");
  453.       else if (sfn is 'E')
  454.    printf("End forwarding\n        (Forward for %d minutes)\n", etime);
  455.       else if (sfn is 'R')
  456.    printf("Begin reverse forward %s\n", lp);
  457.       else printf("Forward %s\n", lp);
  458.       break;
  459.     case 'K': printf("Kill %s\n", lp); break;
  460.     case 'L': printf("List %s\n", lp); break;
  461.     case 'M': printf("Make %s\n", lp); break;
  462.     case 'R': printf("Read %s\n", lp); break;
  463.     case 'S': printf("Send %s\n", lp); break;
  464.     default:  printf("%c   %s\n",sfn, lp); break;
  465.   }
  466. }
  467.  
  468. doexit()
  469. {
  470. #ifndef MCH_AMIGA
  471.   int etime;
  472. #else
  473.   long etime;
  474. #endif
  475.   char *sp;
  476.  
  477.   aconnect = false;
  478.   first = true;
  479.   wasq = (fn is 'Q');
  480.   dis = cur;
  481.   etime = tdiff(&con, &dis);
  482.   if (isuser) connected += (long)etime; else sysop += (long)etime;
  483. #ifdef MCH_AMIGA
  484. /* 'Charge' this connect time to the user */
  485.    if(isuser || sysop_log) {
  486.       fp_conx->connect += etime;
  487.    }
  488. #endif
  489.   if (lall)
  490.   {
  491.     switch(fn)
  492.     {
  493.       case 'A': sp = "(On Line)"; break;
  494.       case 'B': sp = "(Said Bye)"; break;
  495.       case 'D': sp = "(Disconnect)"; break;
  496.       case 'E': sp = "(Excluded)"; break;
  497.       case 'F': sp = "(Forced by sysop)"; break;
  498.       case 'Q': sp = "(Exit from program)"; break;
  499.       case 'T': sp = "(Timed out)"; break;
  500.     }
  501.     printf("Exit %s\n        (Connected for %d minutes.)\n", sp, etime);
  502.   }
  503. }
  504.  
  505. doconn()
  506. {
  507. #ifdef MCH_AMIGA
  508.    register char *p,*q;
  509.    sysop_log = 0;
  510. #endif
  511.   aconnect = true;
  512.   con = cur;
  513.   switch(fn)
  514.   {
  515.     case 'S':
  516.       isuser = false;
  517.       scon++;
  518. #ifndef MCH_AMIGA
  519.       strncpy(call, lp, 6);
  520. #else
  521.       strncpy(sysop_call, lp, 6);
  522. #endif
  523.       idle += (long)tdiff(&dis, &con);
  524. #ifdef MCH_AMIGA
  525.       /* Copy the callsign with SSID and locate the user record */
  526.       p = conx_call;
  527.       q = lp;
  528.       while(*q == ' ')q++;
  529.       while((*q != ' ') && *q) *p++ = *q++;
  530.       while(p < &conx_call[9])*p++ = ' ';
  531.       fp_conx = getuser(conx_call);
  532.       fp_conx->conx_count++;
  533.       sysop_log++;
  534. #endif
  535.       break;
  536.  
  537.     case 'I':
  538.       isuser = false;
  539.       scon++;
  540.       if (wasq) offline += (long)tdiff(&dis, &con);
  541.       else {
  542.          crash++;
  543.          dis = las;
  544.          wasq = true;
  545.          down += (long)tdiff(&dis, &con);
  546.       }
  547. #ifdef MCH_AMIGA
  548. /* The program does not get the number of minutes in the log correct
  549.    unless this is done. This is because a 'C' command calculates the
  550.    time involved from the last 'X'. But sometimes there can be two
  551.    or more ocnsecutive 'C' without an intervening 'X', especially the
  552.    'C...I' indicating a reboot, followed by some arbitrary time later
  553.    by 'C...A' indicating a connect on port 'A'. The second connect would
  554.    compute the time from the last 'X' when in fact it should be using
  555.    the last 'C...I'.
  556. */
  557.       dis = con;
  558. #endif
  559.       break;
  560.  
  561.     case 'L':
  562.       links++;
  563.       break;
  564.  
  565.     default:
  566.       isuser = true;
  567.       ++cbin[i2(cur.day)-1][i2(cur.time)];
  568.       idle += (long)tdiff(&dis, &con);
  569. #ifdef MCH_AMIGA
  570.       /* Copy the callsign with SSID and locate the user record */
  571.       p = conx_call;
  572.       q = lp;
  573.       while(*q == ' ')q++;
  574.       while((*q != ' ') && *q) *p++ = *q++;
  575.       while(p < &conx_call[9])*p++ = ' ';
  576.       fp_conx = getuser(conx_call);
  577.       fp_conx->conx_count++;
  578. #endif
  579.       break;
  580.   }
  581.  
  582.   if (lall) switch(fn)
  583.   {
  584.     case 'S': printf("From local console (%s)\n", lp); break;
  585.     case 'I': printf("System startup\n"); break;
  586.     case 'L': printf("Linked to %s\n", lp); break;
  587.     default:  printf("Connected on port %c to %s\n",fn, lp); break;
  588.   }
  589.   first = false;
  590. }
  591. #ifndef MCH_AMIGA
  592. .tdiff(st,et)
  593. struct t *st, *et;
  594. {
  595.   register int i;
  596.  
  597.   i = t4(et->time) - t4(st->time);
  598.   if (i >= 0) return i;
  599.   if ((st->day[0] is et->day[0]) and (st->day[1] is et->day[1])) return 0;
  600.   return i + 1440;
  601. }
  602. #else
  603. /* The tdiff code will fail if a difference of more than two days is
  604.    requested.
  605. */
  606. long tdiff(st,et)
  607. struct t *st,*et;
  608. {
  609.    register long i,j;
  610.    i = t4(et->time) + (long)i2(et->day)*1440L;
  611.    j = t4(st->time) + (long)i2(st->day)*1440L;
  612.    i -= j;
  613.    if(i < 0)return(0L);
  614.    return(i);
  615. }
  616. #endif
  617.  
  618. i4(t)
  619. char *t;
  620. {
  621.   int i, j;
  622.  
  623.   j = 0;
  624.   for (i = 0; (i < 4) and *t and (*t isnt ' '); i++, t++)
  625.     j = (10 * j) + (*t - '0');
  626.   return j;
  627. }
  628.  
  629. t4(t)
  630. char *t;
  631. { return(60 * i2(t) + i2(t + 2)); }
  632.  
  633. i2(t)
  634. char *t;
  635. {
  636.   if (*t is ' ') *t = '0';
  637.   if (*(t+1) is ' ') *(t+1) = '0';
  638.   return(10*(*t - '0') + (*(t+1) - '0'));
  639. }
  640.